// 通过缓存导入express
const express = require('express')
// 用到了加密密码模块和mysql模块
const utility = require('utility')
// 注意路径
const db = require('../database/index')
const jwt = require('jsonwebtoken')

// 创建路由实例对象
const router = express.Router()

// 非空校验全局中间件在内置中间件之后获取到req.body，在模块化路由之前，发送之前
router.use((req,res,next)=>{
    const {username,password}=req.body
    if (/^\S{6,10}$/.test(username) == false || username == undefined) {
        // return res.send({status:1,message:'用户名必须是6~10位之间的非空白字符串！'})
        // return next(new Error('用户名必须是6~10位之间的非空白字符串！'))
        throw new Error('用户名必须是6~10位之间的非空白字符串！')
    }
    if (/^\S{6,10}$/.test(password) == false || password == undefined) {
        // return res.send({status:1,message:'用户密码必须是6~10位之间的非空白字符串！'})
        // return next(new Error('用户密码必须是6~10位之间的非空白字符串！'))
        throw new Error('用户密码必须是6~10位之间的非空白字符串！')
    }
    // next()通过验证流转到下一个中间件或者路由
    next()

})

// 路由资源地址 url 有同一前缀 在app挂载的时候设置
router.post('/reguser', (req, res) => {
    // 后端接收post请求体用req.body接收，不能直接写，需要配置
    // console.log(req.body);
    // 发送之前 定义sql语句根据用户名查询是否已有用户
    // 解构赋值
    let { username, password } = req.body
    password = utility.md5(password)
    // sql语句
    let sql = `select * from user where username='${username}'`
    db(sql, (err, results) => {
        // 判断sql语句
        if (err) {
            // console.log(err);
            return res.send({ status: 1, message: 'sql语法错误' + err.message })
        }
        // 判断查询 results返回的是一个数组
        if (results.length >= 1) {
            return res.send({ status: 1, message: '用户名已存在，请更换用户名' })
        }
        // 在查询里面 做插入 不能写在外面  let暂时性死区 本身有外面的let无法进入
        // 数据操作
        let sql = `insert into user set username="${username}",password="${password}"`;
        db(sql, (err, results) => {
            // 判断sql语句
            if (err) {
                return res.send({ status: 1, message: 'sql语法错误' + err.message })
            }
            if (results.affectedRows !== 1) {
                return res.send({ status: 1, message: '添加失败！' })
            }
            // 请求成功 响应数据 不能有两个 res.send 会报错
            res.send({ status: 0, message: '注册成功！' })

        })
    })
    // res.send({ status: 0, message: '登录成功！' })
})
//代码堆积不易维护，入口文件接口太多
// 登录端口
router.post('/login', (req, res) => {
    // 接收post参数  用let 未来要加密
    let { username, password } = req.body
    // 加密密码
    password = utility.md5(password)
    // 在sql语句中用and 判断一次就行
    let sql = `select * from user where username="${username}" and password="${password}"`
    // console.log(username, password);
    // 操作数据
    db(sql, (err, results) => {
        if (err) {
            return res.send({ message: err.message, status: 1 })
        }
        // 用户是否存在
        if (results.length === 0) {
            return res.send({ message: '用户名或者密码错误', status: 1 })
        }
        //  npm i jsonwebtoken@8.5.1 在发送登录成功之前生成 jwt的sign方法对象，字符串，对象，在开始加Bearer加一个空格不能多不能少 ，最后发送给用户
        // 第一个参数 对象{ id: results[0].id } results是一个数组，加密的对象的id唯一
        const token = 'Bearer ' + jwt.sign({ id: results[0].id }, 'dijia', { expiresIn: '24h' })
        // 模块化路由，抽离单独的路由文件
        // 不能使用两次  send  
        res.send({ message: '登录成功！', status: 0, token: token })
    })
    // Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    // res.send({ message: '登录成功！', status: 0 })

})
module.exports = router